/**
 * @file user.h 用户模块的头文件
 *  device向上(menu)提供设备用户的结构定义和增删查功能
 *  向下(dlist)调用链表的具体函数来实现这些功能
 *  包含: 
 * 1. 用户结构定义
 * 2. dlist用到的各种具体的比较函数/显示函数等
 * 3. 提供给上层的操作功能函数
 * @author pzk (1528089905@qq.com)
 * @brief 
 * @version 1.0
 * @date 2025-8-4
 * 
 * @copyright copyright (c) 2025
 */

#ifndef USERS_H
#define USERS_H

#include "dlist.h"
#include "comm.h"


//用户结构体
typedef struct users
{
	int user_id;
	char user_name[16];
	char user_pw[16];
}users_t;


/** 
 * @brief  ID生成器，新建设备时+1,全局变量user_id_min  
 * 
 */
int generate_id_user();


/** 
 * @brief  从文件中加载用户列表，形成链表
 * 
 * 
 * @return node_t*  链表头指针
 */
node_t *load_users();


/** 
 * @brief:  将当前链表数据保存到文件中
 * 
 * @param: 
 *      @head  链表头指针
 * @return: int  成功返回0，失败返回-1
 */
int save_users(node_t *head);


/** 
 * @brief： 输入数值添加用户
 * 
 * @param:
 * 		@head    链表头指针
 *      @newdev  新用户数据
 * @return int  成功返回0，失败返回-1
 */
int add_user(node_t * head, const users_t * newuser);


/** 
 * @brief  删除用户,可根据ID，用户名，删除所有符合的
 * 
 * @param 
 * 		@head      链表头指针
 * 		@cmpfun    查找方式
 * 		@user      查找的数据
 * @return int 返回0删除成功，-1删除失败(无用户)
 */
int del_user(node_t *head, cmpfun_t cmpfun, const users_t *user);


/** 
 * @brief  查找用户，可根据账号和ID
 * 返回的是一个新的链表, 使用完毕需要删除
 * 
 * @param 
 *      @head      链表头指针
 *      @cmpfun    查找方式
 *      @user      查找数据
 * @return node_t*  查找到的节点新链表
 */
node_t *find_user(node_t *head, cmpfun_t cmpfun, const users_t *user);


/** 
 * @brief  排序(选择排序法)，根据比较方式(ID,用户名)排序
 * 
 * @param 
 * 		@head     链表头指针
 * 		@cmpfun   比较方式
 * @return int     成功返回0，失败返回-1
 */
int sort_users(node_t *head,cmpfun_t cmpfun);


/** 
 * @brief  登陆检测，根据输入的值与文件里的数据比较
 * 
 * @param 
 * 		@head     链表头指针
 * 		@user     输入的帐号密码
 * @return int     成功返回0，失败返回-1
 */
int login_check(node_t *head,users_t *user);


/** 
 * @brief  显示设备
 * 
 * @param 
 * 		@head      链表头指针
 * 		@showfun   显示方式
 */
void show_users(node_t *head, showfun_t showfun);


/** 
 * @brief  显示函数，格式显示所有数据
 * 
 * @param 
 *      @data 数据
 *
 */
void showUser_All(const void *data);


/** 
 * @brief  比较函数，根据ID，用户名
 * 
 * @param 
 *      @data1 数据1
 *      @data2 数据2
 * @return int 比较结果，0相同
 */
int cmpUser_ID(const void *data1, const void *data2);
int cmpUser_Name(const void *data1,const void *data2);
#endif

